package org.funtester.performance.books.chapter11.section1;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.Throughput)// 制定运行测试模式,当前为吞吐量模式
@State(value = Scope.Thread)//默认为Scope.Thread,含义是每个线程都会有一个实例
@Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS)//预热次数,含义是每个测试会跑多久
@Measurement(iterations = 1, batchSize = 1)//测试迭代次数,批次大小
@Threads(100)//测试线程数
@Fork(value = 1, jvmArgs = {"-Xms1G", "-Xmx1G"})//fork表示每个测试会fork出几个进程
@OutputTimeUnit(TimeUnit.MICROSECONDS)//输出时间单位
public class SyncTest {

    @Benchmark
    public void safeTest() {
        safe();
    }

    @Benchmark
    public void notSafeTest() {
        notSafe();
    }

    public static void main(String[] args) throws RunnerException {
        Options options = new OptionsBuilder()
                .include(SyncTest.class.getSimpleName())//测试类名
                .result("result.json")//测试结果输出到result.json文件
                .resultFormat(ResultFormatType.JSON)//输出格式
                .build();
        new Runner(options).run();
    }

    int i = 0;// 共享变量

    /**
     * 非线程安全
     */
    public void notSafe() {
        i++;
    }

    /**
     * 线程安全
     */
    public synchronized void safe() {
        i++;
    }

}
